/*-*
 * FILENAME  :
 *    $HeadURL$
 *
 * STATUS  :
 *    $Revision$
 *
 *    $Author$
 *    $Date$
 *  
 *    
 * Copyright (c) 2011 Gonalge Ltda. All rights reserved.
 *
 ****************************************************************/

package org.gonalge.rompecabeza.pintado;

import javax.swing.JPanel;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.util.Vector;

import org.gonalge.rompecabeza.dto.Jugador;
import org.gonalge.rompecabeza.dto.Pieza;
import org.gonalge.rompecabeza.negocio.Juego;
import org.gonalge.rompecabeza.util.FormUtils;

/**
 * 
 * @author Geremias Gonzalez
 */
public class PintarCliente extends JPanel {

    /**
     * 
     */
    private static final long serialVersionUID = 4483459228977207344L;

    private Juego juego = null;

    private Vector<Image> imagenes = null;

    private int ancho, alto, n;

    private BufferedImage img;

    private String nombre = null;

    private int x = -1, y = -1;

    private String ganador = "";

    // *****************************************************

    public void setJuego(final Juego juego) {

        this.juego = juego;
        if (juego != null) {
            if (imagenes == null)
                imagenes = new Vector<Image>();
            else
                imagenes.clear();

            this.ancho = juego.getPiezaPerdiente().getAncho();
            this.alto = juego.getPiezaPerdiente().getAlto();
            this.n = juego.getPiezaPerdiente().getN();
            this.img = FormUtils.getImagen(getClass(), juego.getImagen() + "");

            for (int i = 0; i < juego.getPiezaTablero().length(); i++) {
                Pieza p = juego.getPiezaTablero().getPiesa(i);
                imagenes.add(buscarImagen(p.getX(), p.getY()));
            }
        }
        repaint();
    }

    // *******************GRAFICANDO***********************

    private void pintarTextos(Graphics g) {

        g.setFont(new Font("Arial", 1, 15));
        g.setColor(FormUtils.getColorTitulo());
        int asciertos = juego.getAsciertos(nombre);
        int fallidos = juego.getFallas(nombre);
        double rend = 0;

        if (fallidos + asciertos == 0)
            rend = 0;
        else
            rend = (double) (asciertos * 100) / (double) (fallidos + asciertos);

        g.drawString("Rendimiento :  " + Math.round(rend) + " %", 500, 30);

        g.drawString("Jugador : " + nombre, 240, 30);
        g.drawString("Aciertos :  " + asciertos, 240, 50);
        g.drawString("Fallos :  " + fallidos, 500, 50);

        g.setFont(new Font("Arial", 1, 20));
        g.setColor(Color.BLUE);
        g.drawString(ganador, 240, 70);

    }

    private BufferedImage buscarImagen(int x, int y) {
        return img.getSubimage(x + 10, y + 10, ancho + n / 3, alto + n / 3 + 3);

    }

    // ******************PINTADO**********************

    private void pintarFigura(Graphics g, Pieza p) {

        if (p.getEle() > 0) {
            Area a = juego.getArea(p.getTipo(), p.getX(), p.getY());

            g.setClip(a);
            g.drawImage(imagenes.get(p.getEle() - 1), p.getX(), p.getY(), this);
        }
    }

    private void pintarTablero(Graphics2D g) {

        g.drawImage(img, juego.getX() - 10, juego.getY() - 10, this);
        g.drawImage(img, 20, 18, 150, 150, this); // Ayuda

        for (int p = 0; p < juego.getPiezaTablero().length(); p++) {
            Pieza pi = juego.getPiezaTablero().getPiesa(p);
            if (!pi.estado) {
                Area area = juego.getArea(pi.getTipo(), juego.getX() + pi.getX(), juego.getY() + pi.getY());

                if (x != -1 && y != -1)
                    area.subtract(new Area(new Ellipse2D.Double(x, y, 100, 100)));

                g.setColor(FormUtils.getColorFondo());
                g.fill(area);
                g.setColor(Color.BLACK);
                g.draw(area);

            }
        }

    }

    private void pintarFigurasDesordenada(Graphics g) {
        for (int p = 0; p < juego.getPiezaPerdiente().length(); p++)
            pintarFigura(g, juego.getPiezaPerdiente().getPiesa(p));
    }

    private void pintarFigurasJugador(Graphics g) {
        g.setFont(new Font("Arial", 2, 14));
        for (Jugador ju : juego.getJugadores()) {
            if (ju.getPieza() != null) {
                pintarFigura(g, ju.getPieza());
                g.drawString(ju.getNombre(), ju.getPieza().getX() + 10, ju.getPieza().getY() + alto / 2);
            }
        }
        if (ganador.equals(""))
            g.drawImage(FormUtils.getImagen(getClass(), "fin"), 230, 150, this);

    }

    @Override
    public void paint(Graphics g) {
        g.setColor(FormUtils.getColorFondo());
        g.fillRect(0, 0, getWidth(), getHeight());
        if (juego != null) {
            pintarTextos(g);
            pintarTablero((Graphics2D) g);
            pintarFigurasDesordenada(g);
            pintarFigurasJugador(g);
        }
    }

    public void setGanador(String ganador) {
        this.ganador = ganador;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getNombre() {
        return nombre;
    }

    public void cargarXY(int x, int y) {
        if ((x != -1) && (y != -1)) {
            this.x = x - 50;
            this.y = y - 50;
        } else {
            this.x = -1;
            this.y = this.x = -1;
        }
        repaint();
    }
}
